﻿using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Qiniu.Http;
using Qiniu.Storage;
using Qiniu.Util;
using System.Net.Http.Headers;

namespace BW.Rabbit.Write.API.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class RabbitController : ControllerBase
    {
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        [HttpPost] // 指定该方法处理 HTTP POST 请求
        public async Task<IActionResult> UploadImages(IFormFile file) // 定义一个异步方法，接收一个文件类型的参数
        {
            if (file == null || file.Length == 0) // 检查文件是否为空或文件大小
            {
                return BadRequest("文件不能为空");
            }

            string saveKey = "Pic/" + file.FileName; // 设置上传文件保存的路径和文件名,可以随便输入 不用创建可自动生成
            string bucket = "2206lxc"; // 七牛云存储空间名称   七牛云仓库名称
            Mac mac = new Mac("17xNhnoFXiqVbTZImzp7vD_l9D7YyrQbC1D2w7Z0", "DOKzw44nBSbYiSyVjcDLqplWp3d6Jv1EHe_yNWan"); // 替换为您七牛云账号的访问密钥和密钥

            // 设置上传策略
            PutPolicy putPolicy = new PutPolicy();
            putPolicy.Scope = bucket + ":" + saveKey; // 设置 Scope 为具体的文件路径，即指定存储空间和保存路径

            // 创建上传凭证
            string token = Auth.CreateUploadToken(mac, putPolicy.ToJsonString()); // 生成上传凭证，凭证包含了上传策略信息

            // 配置上传管理器
            Config config = new Config();
            config.Zone = Zone.ZONE_CN_South; // 设置上传区域，这里是华北区域   自己选的区域,这个是华北,别的自己搜一下
            config.UseHttps = true; // 使用 HTTPS 进行上传
            config.UseCdnDomains = true; // 使用 CDN 域名加速上传
            config.ChunkSize = ChunkUnit.U512K; // 设置分块上传的块大小

            // 实例化表单上传对象
            FormUploader target = new FormUploader(config);

            // 上传文件
            HttpResult result = target.UploadStream(file.OpenReadStream(), saveKey, token, null); // 调用上传方法，上传文件流，传入保存路径和上传凭证

            // 检查上传结果
            if (result.Code == 200) // 判断上传是否成功（返回状态码200表示成功）
            {
                return Ok(file.FileName); // 返回200响应，上传成功，返回文件名
            }
            else
            {
                return BadRequest("上传失败：" + result.Text); // 如果上传失败，返回400错误响应，包含错误信息
            }
        }


        /// <summary>
        /// 多图片上传
        /// </summary>
        /// <param name="fileser"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        [HttpPost]
        public List<Object> UploadQiniu([FromForm(Name = "file")] List<IFormFile> fileser)
        {
            Mac mac = new Mac("17xNhnoFXiqVbTZImzp7vD_l9D7YyrQbC1D2w7Z0", "DOKzw44nBSbYiSyVjcDLqplWp3d6Jv1EHe_yNWan"); // 替换为您七牛云账号的访问密钥和密钥
            PutPolicy putPolicy = new PutPolicy();
            putPolicy.Scope = "https://portal.qiniu.com/kodo/bucket/resource-v2?bucketName=2206lxc";//图片存放七牛云地址
            string token = Auth.CreateUploadToken(mac, putPolicy.ToJsonString()); // 生成上传凭证，凭证包含了上传策略信息
            IFormFileCollection files = Request.Form.Files;
            Config config = new Config()
            {
                Zone = Zone.ZONE_CN_South,//默认华北 根据选择的不同输入不同的地区
                UseHttps = true
            };
            config.UseCdnDomains = true; // 使用 CDN 域名加速上传
            var res = Request.Form.ToArray();

            FormUploader upload = new FormUploader(config);
            HttpResult result = new HttpResult();
            List<Object> list = new List<Object>();
            foreach (IFormFile file in fileser)//获取多个文件列表集合
            {
                if (file.Length > 0)
                {
                    var _fileName = ContentDispositionHeaderValue
                                    .Parse(file.ContentDisposition)
                                    .FileName
                                    .Trim('"');
                    var _qiniuName = "Pic/" + DateTime.Now.ToString("yyyyMMddHHmmssffffff") + file.FileName;//重命名文件加上时间戳
                    Stream stream = file.OpenReadStream();
                    result = upload.UploadStream(stream, _qiniuName, token, null);
                    if (result.Code == 200)
                    {
                        list.Add(new { fileName = _fileName, qiniuName = _qiniuName, uploadTime = DateTime.Now });
                    }
                    else
                    {
                        throw new Exception(result.RefText);//上传失败错误信息
                    }
                }
            }
            return list;
        }
    }
}
